package com.qdlc.p2p.biz.service;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Account;
import com.qdlc.p2p.dal.dto.Pay;
import com.qdlc.p2p.dal.model.AccountModel;

/**
 * 用户资金账户信息
 *
 * @author Kaiju Zhao
 * @version 1.1.0.0
 * @date 2016-03-04
 */
public interface AccountService {

    /**
     * 更新用户资金账户信息
     *
     * @param account
     * @return
     * @author Kaiju Zhao
     */
    void updateAccount(Account account);

    /**
     * 根据用户userId更新用户的资金账户信息
     *
     * @param userId
     * @param total
     * @param useMoney
     * @param noUseMoney
     * @author Kaiju Zhao
     */
    void updateAccountByUserId(long userId, double total, double useMoney, double noUseMoney);

    /**
     * 更新充值记录,并将充值金额到账
     *
     * @param orderId
     * @param returnText
     * @param pay
     */
    void newRecharge(String orderId, String returnText, Pay pay);

    /**
     * 更新新浪收益
     * 昨日收益及总收益
     *
     * @param account
     * @author Kaiju Zhao
     */
    int updateSinaProfit(Account account);

    /**
     * 增加可用金额和总金额
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void addUseMoneyAndTotal(long userId, long toUserId, double amount);

    /**
     * 冻结资金（可用金额 - amount, 冻结金额 + amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void freeze(long userId, long toUserId, double amount);

    /**
     * 解冻资金（可用金额 + amount, 冻结金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void unFreeze(long userId, long toUserId, double amount);

    /**
     * 扣除可用金额和总金额
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void deductUseMoneyAndTotal(long userId, long toUserId, double amount);

    /**
     * 扣除冻结金额和总金额
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void deductNoUseMoneyAndTotal(long userId, long toUserId, double amount);

    /**
     * 扣除待收金额和总金额（待收金额 - amount, 总金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void deductCollectionAndTotal(long userId, long toUserId, double amount);

    /**
     * 增加待收金额和总金额（待收金额 + amount, 总金额 + amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void addCollectionAndTotal(long userId, long toUserId, double amount);

    /**
     * 收回投资本金（可用金额 + amount, 待收金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void revokeCapital(long userId, long toUserId, double amount);

    /**
     * 收回利息（可用金额 + amount, 待收金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void revokeInterest(long userId, long toUserId, double amount);

    /**
     * 收回利息管理费（总金额 - amount, 待收金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void revokeInterestManageFee(long userId, Long toUserId, double amount);

    /**
     * 收回投资本金（可用金额 + useMoney, 待收金额 - collection）
     *
     * @param userId
     * @param toUserId
     * @param useMoney
     * @param collection
     * @author Kaiju Zhao
     */
    void revokeCapital(long userId, long toUserId, double useMoney, double collection);

    /**
     * 收回投资本金和总资金（总金额 + amount, 可用金额 + amount, 待收金额 - amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void revokeCapitalAndTotal(long userId, long toUserId, double amount);

    /**
     * 扣除冻结金额和增加待收金额（冻结金额 - amount, 待收金额 + amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void deductNoUseMoneyAndAddCollection(long userId, long toUserId, double amount);

    /**
     * 扣除总金额和增加待收金额（总金额 - amount, 待收金额 + amount）
     *
     * @param userId
     * @param toUserId
     * @param amount
     * @author Kaiju Zhao
     */
    void deductTotalAndAddCollection(long userId, long toUserId, double amount);

    /**
     * 查询用户资金账户信息(加有悲观锁，防止并发问题)
     *
     * @param userId
     * @return
     * @author Kaiju Zhao
     */
    Account findAccountByUserId(long userId);

    /**
     * 获取用户可用金额
     *
     * @param userId
     * @return
     * @author Kaiju Zhao
     */
    double findUseMoneyByUserId(long userId);

    /**
     * 分页获取用户资金账户信息列表
     *
     * @param model
     * @return
     * @author Kaiju Zhao
     */
    PageDataList<AccountModel> list(AccountModel model);

    /**
     * 获取所有可用金额
     *
     * @return
     * @author Kaiju Zhao
     */
    double sumAllUseMoney();

    /**
     * 根据年获取平台充值与提现手续费
     *
     * @param year
     * @return
     */
    double[] getCashFeeByYear(String year);

    /**
     * 查询用户资金账户信息(加有悲观锁，防止并发问题)
     *
     * @param id
     * @return
     * @author Kaiju Zhao
     */
    Account findById(long id);

    /**
     * 获取用户可用金额
     *
     * @param userId
     * @return
     * @author hongbinglin
     */
    double sumUseMoney();
}
